package com.itheima.polymorphic_test;

/*
    1 多态的优缺点
        优点 : 提高代码的扩展性,灵活性
        缺点 : 不能调用子类特有功能!

    2 多态的转型
        1 向上转型 : 父类的引用指向了子类对象
        2 向下转型 : 把父类类型数据转成子类类型数据 , 强转!  , 主要解决的是多态不能调用子类特有功能的这个问题!
          格式 : 目标类型  变量名 = (目标类型)数据;
          举例 :
            Animal a = new Dog();
            Dog dog = (Dog)a; 向下转型

    3 ClassCastException : 类型转换异常
    产生原因 : 被转换数据的类型 , 和转换目标类型不一致就会发生类型转换异常
    Animal a = new Dog();
    Cat cat = (Cat)a;// 类型转换异常


    注意 : !!!!!
        1 方法的参数是一个类 , 那么调用此方法需要传入此类的对象或者此类的子类对象
        2 方法的返回值类型是一个类 , 那么需要返回此类的对象或者此类的子类对象
        3 方法的参数是一个接口 , 那么调用此方法需要传入接口的实现类对象
        4 方法的返回值类型是一个接口 , 那么需要返回此接口的实现类对象
 */
public class Test1 {
    public static void main(String[] args) {
        useAnimal(new Dog());
        System.out.println("==========");
        useAnimal(new Cat());
        System.out.println("==========");
        useAnimal(new Pig());
    }

    public static void useAnimal(Animal a) {// Animal a = new Cat()
        a.eat();

        // 对象名 instanceof 引用数据类型
        if (a instanceof Dog) {
            // 向下转型
            Dog dog = (Dog) a;
            dog.lookDoor();
        }

        if (a instanceof Cat) {
            // 向下转型
            Cat cat = (Cat) a;
            cat.catchMouse();
        }

        if (a instanceof Pig) {
            // 向下转型
//            Pig pig = (Pig) a;
//            pig.sleep();
            ((Pig) a).sleep();
        }

    }

//    // 此方法需要测试狗类对象
//    public static void useAnimal(Dog dog){// Dog dog  = new Dog()
//        dog.eat();
//        dog.lookDoor();
//    }
//
//    // 此方法需要测试猫类对象
//    public static void useAnimal(Cat cat){//
//        cat.eat();
//        cat.catchMouse();
//    }
//    // 此方法需要测试猪类对象
//    public static void useAnimal(Pig pig) {//
//        pig.eat();
//        pig.sleep();
//    }

}
